\subsection{Деление}

\subsubsection{Деление используя сдвиги}
\label{division_by_shifting}

Например, возьмем деление на 4:

\begin{lstlisting}[style=customc]
unsigned int f(unsigned int a)
{
	return a/4;
};
\end{lstlisting}

Имеем в итоге (MSVC 2010):

\begin{lstlisting}[caption=MSVC 2010,style=customasmx86]
_a$ = 8		; size = 4
_f	PROC
	mov	eax, DWORD PTR _a$[esp-4]
	shr	eax, 2
	ret	0
_f	ENDP
\end{lstlisting}

\label{SHR}
\myindex{x86!\Instructions!SHR}
Инструкция \SHR (\IT{SHift Right}) в данном примере сдвигает число на 2 бита вправо. 
При этом освободившиеся два бита слева (т.е. самые 
старшие разряды) выставляются в нули. А самые младшие 2 бита выкидываются. 
Фактически, эти два выкинутых бита~--- остаток от деления.

\myindex{x86!\Instructions!SHR}
Инструкция \SHR работает так же как и \SHL, только в другую сторону.

\input{shift_right}

Для того, чтобы это проще понять, представьте себе десятичную систему счисления и число 23. 
23 можно разделить на 10 просто откинув последний разряд (3~--- это остаток от деления). 
После этой операции останется 2 как \glslink{quotient}{частное}.

Так что остаток выбрасывается, но это нормально, мы все-таки работаем с целочисленными
значениями, а не с \glslink{real number}{вещественными}!

Деление на 4 в ARM:

\begin{lstlisting}[caption=\NonOptimizingKeilVI (\ARMMode),style=customasmARM]
f PROC
        LSR      r0,r0,#2
        BX       lr
        ENDP
\end{lstlisting}

Деление на 4 в MIPS:

\begin{lstlisting}[caption=\Optimizing GCC 4.4.5 (IDA),style=customasmMIPS]
        jr      $ra
        srl     $v0, $a0, 2 ; branch delay slot
\end{lstlisting}

\myindex{MIPS!\Instructions!SRL}
Инструкция SRL это \q{Shift Right Logical}.
